package com.example.demo.juc;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 用来控制多个线程相互等待,只有当多个线性都到达时,这些线程才会继续执行
 *
 * 和CountDownLatch相似,都是通过维护计数器来实现的,线程执行Await()方法之后计数器会减1,并进行等待,直到
 * 计数器为0,所有调用await()方法而在等待的线程才能继续执行
 *
 * CyclicBarrier和CountDownLatch的一个区别是:CyclicBarrier的计数器通过调用reset()方法可以循环使用他,所以叫做循环屏障
 *
 * CyclicBarrier的两个构造函数,其中parties指示数器的初始值,BarrierAction在所有线程都达屏障的时候会执行一次
 *
 */
public class CyclicBarrier_Demo01 {

    public static void main(String[] args) {

        final  int totalThread = 10;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i <totalThread ; i++) {
            executorService.execute(()->{
                System.out.println("before....");

                try {
                    cyclicBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
                System.out.println("After....");
            });
        }
        executorService.shutdown();
    }
}
